home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_12_10 / allison / arglist.c < prev    next >
C/C++ Source or Header  |  1994-09-06  |  2KB  |  90 lines

  1. LISTING 3
  2. /* arglist.c:    Recursively reads arguments from files */
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <assert.h>
  7.  
  8. #define CHUNK 10    /* Reallocation amount */
  9.  
  10. static char **args; /* The argument list */
  11. static int nleft;   /* Unused argument slots */
  12. static int nargs;   /* Number of arguments */
  13.  
  14. /* Private Functions */
  15. static void expand(FILE *f);
  16. static void add(char *arg);
  17.  
  18. char **arglist(int old_nargs, char **old_args, int *new_nargs)
  19. {
  20.     int i;
  21.  
  22.     /* Initial Allocation */
  23.     args = calloc(old_nargs,sizeof(char *));
  24.     assert(args);
  25.     nleft = old_nargs;
  26.     nargs = 0;
  27.  
  28.     /* Process each command-line argument */
  29.     for (i = 0; i < old_nargs; ++i)
  30.         if (old_args[i][0] == '@')
  31.         {
  32.             /* Open file of arguments */
  33.             FILE *f = fopen(old_args[i]+1,"r");
  34.             if (f)
  35.             {
  36.                 expand(f);
  37.                 fclose(f);
  38.             }
  39.         }
  40.         else
  41.             add(old_args[i]);
  42.  
  43.     *new_nargs = nargs;
  44.     return args;
  45. }
  46.  
  47. void free_arglist(int n, char **av)
  48. {
  49.     int i;
  50.     for (i = 0; i < n; ++i)
  51.         free(av[i]);
  52.     free(av);
  53. }
  54.  
  55. static void expand(FILE *f)
  56. {
  57.     char token[BUFSIZ];
  58.  
  59.     while (fscanf(f,"%s",token) == 1)
  60.         if (token[0] == '@')
  61.         {
  62.             FILE *g = fopen(token+1,"r");
  63.             if (g)
  64.             {
  65.                 expand(g);
  66.                 fclose(g);
  67.             }
  68.         }
  69.         else
  70.             add(token);
  71. }
  72.  
  73. static void add(char *arg)
  74. {
  75.     if (nleft == 0)
  76.     {
  77.         /* Expand argument list */
  78.         args = realloc(args,(nargs+CHUNK) * sizeof(char *));
  79.         assert(args);
  80.         nleft = CHUNK;
  81.     }
  82.  
  83.     /* Allocate space for and store argument */
  84.     args[nargs] = malloc(strlen(arg) + 1);
  85.     assert(args[nargs]);
  86.     strcpy(args[nargs++], arg);
  87.     --nleft;
  88. }
  89.  
  90.